package com.ruoyi.bus.http;

import com.ejlchina.okhttps.*;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 引入OkHttps网络框架
 */
public class OkHttp {
  
  private static HTTP commonHttp = null;
  
  private static Logger logger = LoggerFactory.getLogger(OkHttp.class);
  
  /**
   * @Description 单例创建通用请求处理器
   * 需要传全路径
   * @Author caiyanshan
   * @Date 2021/4/2 9:56
   * @Param []
   * @Return com.ejlchina.okhttps.HTTP
   */
  private static HTTP getHandler(){
    if(commonHttp == null){
      commonHttp = HTTP.builder().config((OkHttpClient.Builder builder) -> {
        
        //==============超时时间配置=================
        // 连接超时时间（默认10秒）
        builder.connectTimeout(10, TimeUnit.SECONDS);
        // 写入超时时间（默认10秒）
        builder.writeTimeout(10, TimeUnit.SECONDS);
        // 读取超时时间（默认10秒）
        builder.readTimeout(10, TimeUnit.SECONDS);
  
        //==============拦截器配置=================
        builder.addInterceptor((Interceptor.Chain chain) -> {
          Request request = chain.request();//可以设置消息头,记录日志等操作(同步操作,异步可以用预处理器)
          logger.info(request.headers().toString());//打印消息头
          // 必须同步返回，拦截器内无法执行异步操作
          return chain.proceed(request);
        });
        
        
      }) .addMsgConvertor(new GsonMsgConvertor()).build();
    }
    return commonHttp;
  }
  
  /**
   * @Description 全路径请求（同步Get）
   * @Author caiyanshan
   * @Param [url]
   * @Return com.ejlchina.data.Mapper
   */
  public static HttpResult.Body syncGetCommon(String url, Map<String, Object> paramMap){
    return getHandler().sync(url).addUrlPara(paramMap).get().getBody().cache();
  }

  /**
   * @Description 全路径请求（同步Post）
   * @Author caiyanshan
   * @Param [url]
   * @Return com.ejlchina.data.Mapper
   */
  public static HttpResult.Body syncPostCommon(String url, Map<String, Object> paramMap){
    return getHandler().sync(url).bodyType(OkHttps.JSON).addBodyPara(paramMap).post().getBody().cache();
  }
  
  
  
}
